package com.example.demo.controller;

import com.example.demo.bean.User;
import com.example.demo.bean.UserInfo;
import com.example.demo.dao.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

@Controller
@CrossOrigin(allowCredentials = "true", allowedHeaders = "*")//允许跨域传输所有的header参数,解决session不能共享的问题
//@CrossOrigin(origins = {" * "}, allowedHeaders="*")新版写法
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private UserMapper userMapper;

    /*
     * 发送验证码
     * */
    @RequestMapping("/sendmail")
    @ResponseBody
    public String sendMail(String mail, HttpSession session) {
        if (userService.sendMimeMail(mail, session)) {
            return "发送成功!";
        } else {
            return "发送失败!";
        }
    }

    /*
     * 验证码是否正确，然后将用户插入到数据库
     * */
    @RequestMapping("/register")
    @ResponseBody
    public String register(@RequestBody UserInfo userInfo, HttpSession session) {
        /*解决session不能共享的问题：
         * ajax在发送跨域的请求时，为了安全，是不会携带认证信息的，也就是不会将本地的cookie发送到后台的，cookie中存有sessionId，
         * 这样一来，请求发送到后台之后，无法通过request来获取 session的信息。所以：在ajax发送跨域请求的时候，添加配置，
         * 让请求带上cookie信息发送到后台,用ajax请求需要这样设置:xhrFields: {withCredentials: true},
         * 而axios封装了ajax，在vue项目里需要在在main.js文件中添加 axios.defaults.withCredentials=true;
         * 如果改好了会发现跨域问题再度出现，可是明明配置了@corssorigin，*这时发现之前config包代替@corssorigin有作用，
         * 因为里面写了allowCredentials="true", allowedHeaders="*"*，但注解也可以解决此问题，如下:
         * 跨域注解@CrossOrigin需要改成@CrossOrigin(allowCredentials="true", allowedHeaders="*")，允许跨域传输所有的header参数
         * */
        if (userService.CheckCode(userInfo, session)) {
            //保存数据
            User user = userInfo.toUser();

            //写入数据库
            userMapper.RegisterUser(user);
            return "注册成功!";
        } else {
            return "注册失败!";
        }
    }

    /*
     * 登录使用验证码,发送验证码，然后检验验证码是否正确，正确之后查询是否有此邮箱在数据库。
     * */
    @RequestMapping("/loginbymail")
    @ResponseBody
    public String LoginUserByMail(@RequestBody UserInfo userInfo, HttpSession session) { //这里的userinfo只负责接受前端的mail和code
        //其他值前端没有传,但只要userinfo封装了这两个属性，一样可以接收他们!!!!
        if (userService.CheckCode(userInfo, session)) {
            int i = userMapper.queryUserByMail(userInfo.getMail());
            if (i > 0) {
                return "登录成功!";
            } else {
                return "登录失败!邮箱不存在";
            }
        } else {
            return "登录失败!验证码错误";
        }
    }

    /*
     * 登录使用账号密码
     * */
    @RequestMapping("/loginbypw")
    @ResponseBody
    public String LoginUserByPw(@RequestBody User user) {
        int i = userMapper.LoginUserByPw(user);//这里只判断username和password。传过来的user没有mail属性,和上面一样!
        if (i > 0) {
            return "登录成功!";
        } else {
            return "登录失败!用户名或密码错误";
        }
    }
}
